﻿#region File and License Information
/*
<File>
	<License>
		Copyright © 2009 - 2017, Daniel Vaughan. All rights reserved.
		This file is part of Calcium (http://calciumsdk.net), 
		which is released under the MIT License.
		See file /Documentation/License.txt for details.
	</License>
	<CreationDate>2010-09-21 17:24:28Z</CreationDate>
</File>
*/
#endregion
//
//using System;
//using System.ComponentModel;
//using System.Linq;
//using System.Windows;
//using System.Windows.Controls;
//using System.Windows.Data;
//
//namespace Outcoder.ComponentModel
//{
//	public static class PropertyValidation
//	{
//		#region ValidateProperty
//		public static readonly DependencyProperty ValidateProperty
//			= DependencyProperty.RegisterAttached(
//				"Validate",
//				typeof(string),
//				typeof(PropertyValidation),
//				new PropertyMetadata(OnValidatePropertyChanged));
//
//		public static void SetValidate(Control obj, string value)
//		{
//			obj.SetValue(ValidateProperty, value);
//		}
//
//		public static string GetValidate(Control obj)
//		{
//			return (string)obj.GetValue(ValidateProperty);
//		}
//		#endregion
//
//		#region ValidationBehaviorProperty
//		static readonly DependencyProperty ValidationBehaviorProperty
//			= DependencyProperty.RegisterAttached(
//				"ValidationBehavior",
//				typeof(ValidationBehavior),
//				typeof(PropertyValidation),
//				null);
//
//		public static void SetValidationBehavior(Control obj, ValidationBehavior value)
//		{
//			obj.SetValue(ValidationBehaviorProperty, value);
//		}
//
//		public static ValidationBehavior GetValidationBehavior(Control obj)
//		{
//			return (ValidationBehavior)obj.GetValue(ValidationBehaviorProperty);
//		}
//		#endregion
//
//		static void OnValidatePropertyChanged(
//			DependencyObject d, DependencyPropertyChangedEventArgs e)
//		{
//			Control control = (Control)d;
//			DataContextChangedListener.Unsubscribe(control, OnDataContextChanged);
//			DataContextChangedListener.Subscribe(control, OnDataContextChanged);
//		}
//
//		static ValidationBehavior GetOrCreateValidationBehavior(Control d)
//		{
//			var behaviour = GetValidationBehavior(d);
//			if (behaviour == null)
//			{
//				behaviour = new ValidationBehavior(d);
//				SetValidationBehavior(d, behaviour);
//			}
//			return behaviour;
//		}
//
//		static void OnDataContextChanged(
//			DependencyObject d, DependencyPropertyChangedEventArgs e)
//		{
//			Control control = (Control)d;
//			ValidationBehavior behavior = GetOrCreateValidationBehavior(control);
//
//			INotifyDataErrorInfo oldInfo = e.OldValue as INotifyDataErrorInfo;
//			if (oldInfo != null)
//			{
//				behavior.Unsubscribe(oldInfo);
//			}
//
//			INotifyDataErrorInfo newInfo = e.NewValue as INotifyDataErrorInfo;
//			if (newInfo != null)
//			{
//				behavior.Unsubscribe(newInfo);
//				behavior.Subscribe(newInfo);
//			}
//		}
//
//		public class ValidationBehavior
//		{
//			WeakReference owner;
//
//			public Control Owner
//			{
//				get
//				{
//					return owner != null ? (Control)owner.Target : null;
//				}
//				private set
//				{
//					owner = new WeakReference(value);
//				}
//			}
//
//			public ValidationBehavior(Control owner)
//			{
//				Owner = ArgumentValidator.AssertNotNull(owner, "owner");
//			}
//
//			public void Subscribe(INotifyDataErrorInfo errorNotifier)
//			{
//				ArgumentValidator.AssertNotNull(errorNotifier, "errorNotifier");
//				errorNotifier.ErrorsChanged += OnErrorsChanged;
//			}
//
//			public void Unsubscribe(INotifyDataErrorInfo errorNotifier)
//			{
//				ArgumentValidator.AssertNotNull(errorNotifier, "errorNotifier");
//				errorNotifier.ErrorsChanged -= OnErrorsChanged;
//			}
//
//			void OnErrorsChanged(object sender, DataErrorsChangedEventArgs args)
//			{
//				var control = Owner;
//				if (control == null)
//				{
//					Unsubscribe((INotifyDataErrorInfo)sender);
//					return;
//				}
//
//				string propertyName = null;
//				var textBox = control as TextBox;
//				if (textBox != null)
//				{
//					BindingExpression expression
//						= textBox.GetBindingExpression(TextBox.TextProperty);
//					if (expression != null
//						&& expression.ParentBinding != null
//						&& expression.ParentBinding.Path != null)
//					{
//						propertyName = expression.ParentBinding.Path.Path;
//					}
//				}
//
//				if (string.IsNullOrEmpty(propertyName))
//				{
//					propertyName
//						= (string)control.GetValue(ValidateProperty);
//				}
//
//				INotifyDataErrorInfo info = (INotifyDataErrorInfo)sender;
//				var errors = info.GetErrors(propertyName);
//				bool hasErrors = errors != null
//								 && errors.Cast<object>().Any();
//
//				VisualStateManager.GoToState(control,
//						   hasErrors ? "InvalidUnfocused" : "Valid", true);
//			}
//		}
//	}
//}